/**
 * 递归深拷贝
 * @param {Object|Array} obj 需要拷贝的数据
 * @returns 拷贝结果
 */
const deepClone = (obj) => {
  let result = Array.isArray(obj) ? [] : {};

  if (obj && typeof obj === "object" && obj !== null) {
    for (let k in obj) {
      if (obj.hasOwnProperty(k)) {
        if (obj[k] && typeof obj[k] === "object") {
          result[k] = deepClone(obj[k]);
        } else {
          result[k] = obj[k];
        }
      }
    }
  }

  return result;
};

/**
 * JSON方法拷贝
 * @param {Object|Array} obj 需要拷贝的数据
 * @returns 拷贝结果
 * 这种会有如下问题：
 * 使用这个方法，对象中不能有Date, functions, undefined, Infinity, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, sparse Arrays这些数据类型。
 */
const deepClone_json = (obj) => JSON.parse(JSON.stringify(obj));

// 展开运算符进行拷贝
// 这种方式只能用于单层json对象，也就是对象中的每个value都是基本类型，没有嵌套。
const deepClone_es6 = (obj) => ({ ...obj });

// ES6 assign 方法
// 这种方式只能用于单层json对象，也就是对象中的每个value都是基本类型，没有嵌套。
const deepClone_assign = (obj) => Object.assign({}, obj);

// lodash
// const deepClone_lodash = obj => lodash.clonedeep(obj)
